package edu.biwu.controller;

import edu.biwu.vo.User;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;
import java.util.Map;
import java.util.stream.Stream;

@Controller
@RequestMapping("/user")
public class UserController {

    /**
     * 默认类型的参数绑定
     * @return
     */
    @RequestMapping("/list.do")
    public String list(HttpServletRequest request, HttpServletResponse response, HttpSession session, Model model) {
        System.out.println(request);
        System.out.println(response);
        System.out.println(session);
        System.out.println(model);
        return "userList";
    }

    /*
       基本类型的参数绑定
    *  第一种解决方案(推荐) :所有的参数都指定@RequestParam
       第二种解决方案:启用Java编译器的参数名称保留功能,在pom.xml假如以下配置
    * */

    @PostMapping("/submitBaseType.do") // @RequestParam("name") 注解与前端传过来的参数一致相绑定
    public String submitBaseType(@RequestParam("name") String username, @RequestParam("password") String password){
        System.out.println(username+" "+password);
        return "success";
    }

    @PostMapping("/submitBaseType02.do") // @RequestParam("name") 注解与前端传过来的参数一致相绑定
    public String submitBaseType02(String username,String password){
        System.out.println(username+" "+password);
        return "success";
    }

    /*
    *   VO类型参数绑定
    *   前端提交的参数名和类中属性名需要一一对应才能完成绑定
    * */

    @PostMapping("/submitVoType.do")
    public String submitVoType(User user){
        System.out.println(user.getUsername()+" "+user.getPassword());
        return "success";
    }

    /*
    *   VO包装类型参数绑定
    *   交包装类型的时候参数名需要写成:包装类型的属性名.该包装类中的属性名 包装类 包装类型.属性名
    * */
    @PostMapping("submitVoType02.do")
    public String submitVoType02(User user){
        System.out.println(user);
        return "success";
    }

    /*
    *   数组类型参数绑定
    *   交数组类型的时候参数名需要写成:hobby=乒乓球&hobby=篮球&hobby=LOL
    * */
    @PostMapping("submitArray.do")
    public String submitArray(String[] hobby){
//        System.out.println(Arrays.toString(hobby));
        Stream.of(hobby).forEach(System.out::println);
        return "success";
    }

    /**
     * 列表参数类型绑定: 需要使用@RequestParam注解进行参数绑定
     *  前端输入参数格式:hobby=乒乓球&hobby=篮球&hobby=LOL 与数组一样 如果提交的参数名与属性名一致 则可以省略@RequestParam注解中的"hobby" @RequestParam
     * @param hobby
     * @return
     */
    @PostMapping("/submitList.do")
    public String submitList(@RequestParam("hobby")List<String> hobby) {
        hobby.forEach(System.out::println);
        return "success";
    }

    /**
     * map集合参数类型绑定: 需要使用@RequestParam注解进行参数绑定
     *
     * @param map
     * @return
     */
    @RequestMapping("/submitMap.do")
    public String submitMap(@RequestParam Map<String, String> map) {
        System.out.println(map);
        map.forEach((key,value)-> System.out.println(key+" "+value)); //用lambda表达式遍历map集合
        return "success";
    }
}
